home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
magl
/
pixel.asm
< prev
next >
Wrap
Assembly Source File
|
1991-10-18
|
19KB
|
936 lines
;
; 'Magl.exp' for FM-TOWNS
;
; - MAKIchan Graphic loader is not 鮪だ! -
;
; Version 0.30 Update 1991/04/09
;
; programmed by MALOR
;
.386p
HeaderSize equ 32/4
Plane2 equ 0104h
Plane1 equ 010ch
CODE segment dword public use32 'CODE'
assume cs:CODE,ds:DATA
;int inpb(int addr)
public inpb
db 'inpb',4
inpb proc near
xor eax,eax
mov dx,[esp+4]
in al,dx
ret
inpb endp
;void outpb(int addr,int dat)
public outpb
db 'outpb',5
outpb proc near
mov dx,[esp+4]
mov al,[esp+8]
out dx,al
ret
outpb endp
;****************************************
; mag format pixel decode
;****************************************
;int mag(char *maghead,int mode,int offset,int xpixel);
flgdec macro flg_bit ;flag decode macro
local Then
local Endif
rol dl,1
jnc short Then
lodsb ;read flag b to al
;flag b pointer(esi) incliment
jmp short Endif
align 4
Then: xor al,al ;write 0 to flag
Endif: stosb ;write al to es:[edi]
;flag pointer(edi) incliment
endm
public mag
db 'mag',3
align 4
mag proc near
pushad ;汎用レジスタ全部push
mov eax,ss:[esp+36+4] ;mode
mov ds:[Mode],eax
mov eax,ss:[esp+36+8] ;VRAMオフセット
mov ds:[Vofs],eax
mov eax,ss:[esp+36+12] ;横方向のループ回数
mov ds:[Xloopc],ax
mov esi,ss:[esp+36+0] ;ヘッダをコピー
cld ;メモリ転送はインクリメント方向
push es
mov ax,ds ;dsをesにコピー
mov es,ax
mov edi,offset Header
mov ecx,HeaderSize
rep movsd
;flag a,b decode
mov ebp,ds:[flga] ;*ebp=flga
mov esi,ds:[flgb] ;*esi=flgb
mov edi,ds:[flg ] ;*edi=flg
movzx edx,ds:[RY] ;Y方向のループ回数セット
sub dx,ds:[LY]
inc edx
mov ds:[YLoopc],dx ;ワークにセット
movzx eax,ds:[XLoopc] ;X方向のループ回数セット
mul edx ;eax = eax * edx;edx broken
mov ebx,eax
mov ecx,eax ;Loop counter (ecx) set
shr ecx,3 ;ecx = ecx / 8
align 4
LOOP2: jz short LOOP2_Exit
mov dl,ds:[ebp]
flgdec ;展開じゃ展開じゃ!
flgdec
flgdec
flgdec
flgdec
flgdec
flgdec
flgdec
inc ebp
dec ecx
jmp short LOOP2
LOOP2_Exit:
mov dl,ds:[ebp]
and ebx,7h
jmp ds:[ebx*4+Jtable2]
align 4
jt27: flgdec
jt26: flgdec
jt25: flgdec
jt24: flgdec
jt23: flgdec
jt22: flgdec
jt21: flgdec
jt20:
; 1 line xor
mov esi,ds:[flg] ;esi = 1ライン上のポインタ
mov edi,esi ;edi = フラグのポインタ
movzx ecx,ds:[XLoopc] ;ecx = *XLoopc
add edi,ecx ;edi = esi + *XLoopc
movzx eax,ds:[RY]
sub ax,ds:[LY] ;eax = ry - ly
mul ecx ;eax *= ecx ;edx broken
mov ecx,eax ;ecx = Loop counter
mov ebx,eax
shr ecx,2
align 4
LOOP1: jz short LOOP1_Exit
lodsd
xor ds:[edi],eax
add edi,4
dec ecx
jmp short LOOP1
LOOP1_Exit:
and ebx,3
jmp ds:[ebx*4+Jtable1]
align 4
jt13: lodsb
xor ds:[edi],al
inc edi
jt12: lodsb
xor ds:[edi],al
inc edi
jt11: lodsb
xor ds:[edi],al
jt10:
mov eax,ds:[Mode]
and eax,20h
jz Mem ;仮想vramに展開
movzx ecx,ds:[LX] ;左端のVRAMオフセット計算
mov bl,ds:[Screen]
and bl,80h
jnz short ThenA
shr ecx,3
shl ecx,2 ;ecx = (ecx/8)*4
jmp short EndifA
ThenA: shr ecx,2
shl ecx,2 ;ecx = (ecx/4)*4
EndifA: add ds:[Vofs],ecx ;水平方向誤差修正
mov eax,ds:[Lineofs]
movzx ecx,ds:[LY]
mul ecx ;eax = LY * Lineofs ;edx broken
add ds:[Vofs],eax ;垂直方向誤差修正
mov edi,ds:[Vofs] ;edi = VRAMのポインタ
mov ax,Plane1
mov bl,ds:[Screen]
and bl,80h
jnz Mode8 ;256色展開
mov ax,Plane2
jmp short Mode4 ;DOS互換モード
Mem: mov edi,ds:[vram]
mov ds:[Vofs],edi
mov ax,ds
mov bl,ds:[Screen]
and bl,80h
jnz Mode8
;pixel decode (16色モード)
Mode4: mov es,ax ;VRAMセレクタセット
xor ebx,ebx ;関係レジスタ初期化
xor edx,edx
xor ecx,ecx
;edi = VRAM/RAMへのポインタ
mov esi,ds:[flg] ;esi = フラグのポインタ
mov ebp,ds:[pix] ;ebp = ピクセルのポインタ
mov dx,ds:[YLoopc] ;Y方向のループ回数セット
align 4
LOOPY2: mov cx,ds:[XLoopc] ;cx set
;左ピクセル展開
align 4
LOOPX2: xor ebx,ebx
mov bl,ds:[esi] ;flag read
jmp ds:[ebx*4+Jtable3]
LOOPX2_Exit:
mov edi,ds:[Vofs] ;ediに1ライン分のオフセット加算
add edi,ds:[Lineofs]
mov ds:[Vofs],edi
dec dx
jnz short LOOPY2
jmp Exit
;特化ピクセル展開ルーチン群
; flag = 00h
align 4
jtp0: mov eax,ds:[ebp] ;pixel read to ax
add ebp,4 ;pixel incliment
ror al,4 ;上位下位4ビット交換
ror ah,4
ror eax,16
ror al,4 ;上位下位4ビット交換
ror ah,4
ror eax,16
stosd
inc esi ;Flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = 0?h
align 4
jtp1: and bl,0fh
mov ebx,ds:[ebx*4+Mofs] ;前方参照
mov ax,es:[edi+ebx+2] ;VRAM read to ax
shl eax,16
mov ax,ds:[ebp] ;pixel read to ax
add ebp,2
ror al,4 ;上位下位4ビット交換
ror ah,4
stosd
inc esi ;flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = ?0h
align 4
jtp2: mov ax,ds:[ebp] ;pixel read to ax
add ebp,2 ;pixel incliment
ror al,4 ;上位下位4ビット交換
ror ah,4
shl eax,16
shr bl,4
mov ebx,ds:[ebx*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
stosd
inc esi ;flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = ??h
align 4
jtp3: and ebx,0fh
mov ebx,ds:[ebx*4+Mofs] ;前方参照
mov ax,es:[edi+ebx+2] ;VRAM read to ax
shl eax,16
xor ebx,ebx
mov bl,ds:[esi] ;flag read
shr bl,4
mov ebx,ds:[ebx*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
stosd
inc esi ;Flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = 01h
align 4
jtp4: mov ax,ds:[ebp] ;pixel read to ax
add ebp,2 ;pixel incliment
ror al,4 ;上位下位4ビット交換
ror ah,4
mov bx,ax
shl eax,16
or eax,ebx
stosd
inc esi ;Flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = ?1h
; or same two pixels read
align 4
jtp5: shr bl,4
mov ebx,ds:[ebx*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
xor ebx,ebx
mov bx,ax
shl eax,16
or eax,ebx
stosd
inc esi ;Flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = 10h
align 4
jtp6: mov ax,ds:[ebp] ;pixel read to ax
add ebp,2 ;pixel incliment
ror al,4 ;上位下位4ビット交換
ror ah,4
ror eax,16
stosd
inc esi ;Flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = 1?h
align 4
jtp7: and bl,0fh
mov ebx,ds:[ebx*4+Mofs] ;前方参照
mov ax,es:[edi+ebx+2] ;VRAM read to ax
ror eax,16
stosd
inc esi ;Flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = 22h
align 4
jtp8: stosd
inc esi ;Flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = 33h 44h .... eeh ffh
align 4
jtps: shr bl,4
mov ebx,ds:[ebx*4+Mofs] ;前方参照
mov eax,es:[edi+ebx] ;VRAM read to ax
stosd
inc esi ;Flag incliment
dec ecx
jnz LOOPX2
jmp LOOPX2_Exit
; flag = 11h,12h
align 4
jtpe: mov ebx,eax ; eax = pre pixel data
shr ebx,16
xor ax,ax
or eax,ebx
temp: stosd
inc esi ;Flag incliment
dec ecx
jz LOOPX2_Exit
mov bl,ds:[esi]
cmp bl,11h ;名付けて11hアクセレーター!
je short temp
or ecx,ecx
jnz LOOPX2
jmp LOOPX2_Exit
;pixel decode (256色モード)
Mode8: mov es,ax ;VRAMセレクタセット
xor eax,eax ;関係レジスタ初期化
xor ebx,ebx
xor edx,edx
xor ecx,ecx
mov ebp,ds:[flg] ;ebp = フラグのポインタ
mov esi,ds:[pix] ;esi = ピクセルのポインタ
mov dx,ds:[YLoopc] ;Y方向のループ回数セット
;Y loop counter=dx
test dx,0ffffh
align 4
LOOPY3: jz Exit
mov cx,ds:[XLoopc] ;cx set
test cx,0ffffh
;左ピクセル展開
align 4
LOOPX3: jz short LOOPX3_Exit
mov al,ds:[ebp] ;flag read
shr al,4
jz short Then5
mov ebx,ds:[eax*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
jmp short Endif5
align 4
Then5: lodsw ;pixel read to ax
;pixel pointer(esi) incliment
Endif5: stosw ;VRAM write from ax
;VRAM pointer(edi) incliment
xor eax,eax
;右ピクセル展開
mov al,ds:[ebp] ;flag read
and al,0fh
jz short Then6
mov ebx,ds:[eax*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
jmp short Endif6
align 4
Then6: lodsw ;pixel read to ax
;pixel pointer(esi) incliment
Endif6: stosw ;VRAM write from ax
;VRAM pointer(edi) incliment
xor eax,eax
inc ebp ;Flag incliment
dec ecx
jmp short LOOPX3
; loop LOOPX3
LOOPX3_Exit:
mov edi,ds:[Vofs] ;ediに1ライン分のオフセット加算
add edi,ds:[Lineofs]
mov ds:[Vofs],edi
dec dx
jmp LOOPY3
Exit: pop es
popad ;汎用レジスタ全部pop
ret
mag endp
;****************************************
; maki format pixel decode
;****************************************
mkiflg macro
local Endif1
local Endif2
rol dl,1 ;Carry Flagに抽出
jnc short Endif1 ;CF == 0 : jmp Endif
lodsw ;Read from flag b to ax
;flag b pointer(esi)incliment
mov bx,ax
and ax,0f0f0h
shl bx,4
and bx,0f0f0h
mov ds:[edi],al ;write to Flag
mov ds:[edi+40],bl
mov ds:[edi+80],ah
mov ds:[edi+120],bh
Endif1: rol dl,1
jnc short Endif2
lodsw
mov bx,ax
shr ax,4
and ax,0f0fh
and bx,0f0fh
or ds:[edi],al
or ds:[edi+40],bl
or ds:[edi+80],ah
or ds:[edi+120],bh
Endif2: inc edi
endm
mkipix macro
local Then
local Endif
rol dl,1 ;Carry flagに抽出
jc short Then ;CF == 1 : jmp Then
xor al,al ;write 0 to pix
jmp short Endif
align 4
Then: lodsb ;read from pix to al
;pix pointer(esi) incliment
ror al,4 ;上位下位交換
Endif: stosb ;write al to VRAM(es:[edi])
endm
;int mki(char *mkihead,int mode,int offset);
public mki
db 'mki',3
align 4
mki proc near
pushad
mov eax,ss:[esp+36+4] ;mode
mov ds:[Mode],eax
mov eax,ss:[esp+36+8] ;VRAMオフセット
mov ds:[Vofs],eax
mov eax,ss:[esp+36+0] ;ヘッダ先頭アドレス
mov ds:[SizA],eax ;SizAが代わりのワーク
cld ;flag clear
mov ecx,4000
mov edi,ds:[flg]
xor eax,eax
rep stosd
;flag a,b decode
mov ecx,100 ;ecx = Y loop counter
mov edi,ds:[flg] ;edi = flag pointer
mov esi,ds:[flgb] ;esi = flag b pointer
mov ebp,ds:[flga] ;ebp = flag a pointer
align 4
LOOPY5: mov dh,10 ;dh = X loop counter
align 4
LOOPX5: mov dl,ds:[ebp] ;dl = flag a
mkiflg
mkiflg
mkiflg
mkiflg
inc ebp ;flag a pointer(ebp) incliment
dec dh ;X loop counter decliment
jnz LOOPX5
add edi,40*3 ;1 line offset
dec ecx ;Y loop counter decliment
jnz LOOPY5
;pixel decode
mov eax,ds:[Mode]
and eax,20h
jz Pix2M ;メモリ展開モード
mov ebx,ds:[Mode]
and ebx,40h
jnz Pix2V ;DOS互換モード
;1024*512画面モード
align 4
Pix1: mov ax,Plane2 ;VRAM selecter set to es
mov es,ax
mov edi,ds:[Vofs] ;es:[edi] = VRAM pointer
mov esi,ds:[pix] ;esi = pix pointer
mov ebp,ds:[flg] ;ebp = Flag pointer
xor eax,eax ;eax clear
mov ebx,400 ;Y loop counter = ebx
align 4
LOOPY6: mov ecx,40
align 4
LOOPX6: mov dl,ds:[ebp]
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
inc ebp
dec ecx
jnz LOOPX6
add edi,192
dec ebx
jnz LOOPY6
mov esi,ds:[Vofs] ; 1 Line Xor
mov edi,esi
mov eax,ds:[SizA]
mov al,ds:[eax+6]
cmp al,'A'
je Then9
cmp al,'B'
jne Exit2
add edi,512*4 ; 4 Line 毎
mov ebx,396
jmp Endif9
Then9: add edi,512*2 ; 2 Line 毎
mov ebx,398
Endif9:
align 4
LOOPY7: mov ecx,80
align 4
LOOPX7: mov eax,es:[esi]
xor es:[edi],eax
add esi,4
add edi,4
loop LOOPX7
add esi,192
add edi,192
dec ebx
jnz LOOPY7
jmp Exit2
;DOS互換モード&仮想vram
Pix2M: mov ax,ds ;Data selecter set to es
mov edi,ds:[vram] ;仮想vramアドレス
mov ds:[Vofs],edi
jmp short Pix2
Pix2V: mov ax,Plane2 ;VRAM selecter set to es
xor edi,edi ;vramアドレス初期化
mov ds:[Vofs],edi
Pix2: mov es,ax
xor eax,eax
mov ecx,16000
mov esi,ds:[pix]
mov ebp,ds:[flg]
align 4
LOOP8: mov dl,ds:[ebp]
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
inc ebp
dec ecx
jnz LOOP8
mov edi,ds:[Vofs]
mov esi,edi
mov eax,ds:[SizA]
mov al,ds:[eax+6]
cmp al,'A'
je short Then10
cmp al,'B'
jnz Exit2
add edi,320*4 ; 4 Line 毎
mov ecx,396*80
jmp short Endif10
Then10: add edi,320*2 ; 2 Line 毎
mov ecx,398*80
Endif10:
align 4
LOOP9: mov eax,es:[esi]
xor es:[edi],eax
add esi,4
add edi,4
loop LOOP9
Exit2: mov ax,ds
mov es,ax
popad
ret
mki endp
;************************************
; Copy memory to VRAM
;************************************
;int move(int xbyte,int ylooptime,int sofs,int slineofs,int seg,int dofs,int dlineofs);
public move
db 'move',4
align 4
move proc near
pushad
mov ecx,ss:[esp+36+0] ;x loop counter = ecx
mov ds:[XLoopc],cx
mov ebx,ss:[esp+36+4] ;y loop counter = ebx
mov eax,ss:[esp+36+8] ;source オフセット
mov ds:[Sofs],eax
mov eax,ss:[esp+36+12] ;source line オフセット
mov ds:[Slofs],eax
mov eax,ss:[esp+36+16] ;dest. セレクタ
mov es,ax
mov eax,ss:[esp+36+20] ;dest. オフセット
mov ds:[Vofs],eax
mov eax,ss:[esp+36+24] ;dest. line オフセット
mov ds:[Vlofs],eax
xor ecx,ecx
mov esi,ds:[Sofs]
mov edi,ds:[Vofs]
align 4
LOOP10: mov cx,ds:[XLoopc]
shr cx,2
rep movsd
mov cx,ds:[Xloopc]
and cx,3
rep movsb
mov esi,ds:[Sofs]
add esi,ds:[Slofs]
mov ds:[Sofs],esi
mov edi,ds:[Vofs]
add edi,ds:[Vlofs]
mov ds:[Vofs],edi
dec ebx
jnz short LOOP10
mov ax,ds
mov es,ax
popad
ret
move endp
CODE ends
DATA segment dword
assume ds:DATA
align 4
;前方参照オフセットアドレステーブル
Mofs dd -(512*0+0),-(512*0+2),-(512*0+4),-(512*0+8)
dd -(512*1+0),-(512*1+2)
dd -(512*2+0),-(512*2+2),-(512*2+4)
dd -(512*4+0),-(512*4+2),-(512*4+4)
dd -(512*8+0),-(512*8+2),-(512*8+4)
dd -(512*16+0)
;1ライン分のオフセット
Lineofs dd 512
align 4
; header
Header db 0 ;ヘッダの先頭
Machine db 0 ;機種コード
Rflg db 0 ;機種依存フラグ
Screen db 0 ;スクリーンモード
LX dw 0 ;表示開始位置X
LY dw 0 ;表示開始位置Y
RX dw 639 ;表示終了位置X
RY dw 399 ;表示終了位置Y
OffA dd 0 ;フラグAのオフセット
OffB dd 0 ;フラグBのオフセット
SizB dd 0 ;フラグBのサイズ
OffP dd 0 ;ピクセルのオフセット
SizP dd 0 ;ピクセルのサイズ
;Other work
SizA dd 0 ;フラグAのサイズ
;Temporary work
XLoopc dw 0 ;X方向のループ回数
YLoopc dw 0 ;Y方向のループ回数
Vofs dd 0 ;展開領域の左端のVRAMオフセット
Mode dd 4 ;画面モード == 4 : 16色1024*512モード
; == 8 : 256色1024*512モード
; == 1 : DOS互換640*400モード
Sofs dd 0 ;展開元領域の左端オフセット
Slofs dd 0 ;
Vlofs dd 0 ;
;Table
;xorループの出口のジャンプテーブル
Jtable1 dd offset jt10,offset jt11, offset jt12,offset jt13
;flag decode ループの出口のジャンプテーブル
Jtable2 dd offset jt20,offset jt21,offset jt22,offset jt23
dd offset jt24,offset jt25,offset jt26,offset jt27
;pixcel decode (16色) の特化ジャンプテーブル
;jtp0 : flag = 00h ;jtp1 : flag = 0?h
;jtp2 : flag = ?0h ;jtp3 : flag = ??h
;jtp4 : flag = 01h ;jtp5 : flag = ?1h
;jtp6 : flag = 10h ;jtp7 : flag = 1?h
;jtp8 : flag = 22h ;;jtp9 : flag = 21h ;;印は効果が期待でき
;;jtpa : flag = 02h ;;jtpb : flag = ?2h ないので、未サポート
;;jtpc : flag = 20h ;;jtpd : flag = 2?h
;jtpe : flag = 11h,12h
; 連続ピクセルを参照
;jtps : flag = 33h,・・・・・・,ffh
; 2ピクセルが同一ピクセルを参照
;jtp5 : flag = 45h,67h,78h,9ah,abh,cdh,deh
Jtable3 dd offset jtp0,offset jtp4,offset jtp1,offset jtp1 ; 00h ~ 0fh
dd offset jtp1,offset jtp1,offset jtp1,offset jtp1
dd offset jtp1,offset jtp1,offset jtp1,offset jtp1
dd offset jtp1,offset jtp1,offset jtp1,offset jtp1
dd offset jtp6,offset jtpe,offset jtpe,offset jtp7 ; 10h ~ 1fh
dd offset jtp7,offset jtp7,offset jtp7,offset jtp7
dd offset jtp7,offset jtp7,offset jtp7,offset jtp7
dd offset jtp7,offset jtp7,offset jtp7,offset jtp7
dd offset jtp2,offset jtp5,offset jtp8,offset jtp3 ; 20h ~ 2fh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtps ; 30h ~ 3fh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; 40h ~ 4fh
dd offset jtps,offset jtp5,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; 50h ~ 5fh
dd offset jtp3,offset jtps,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; 60h ~ 6fh
dd offset jtp3,offset jtp3,offset jtps,offset jtp5
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; 70h ~ 7fh
dd offset jtp3,offset jtp3,offset jtp3,offset jtps
dd offset jtp5,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; 80h ~ 8fh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtps,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; 90h ~ 9fh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtps,offset jtp5,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; a0h ~ afh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtps,offset jtp5
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; b0h ~ bfh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtps
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; c0h ~ cfh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtps,offset jtp5,offset jtp3,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; d0h ~ dfh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtps,offset jtp5,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; e0h ~ efh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtps,offset jtp3
dd offset jtp2,offset jtp5,offset jtp3,offset jtp3 ; f0h ~ ffh
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtp3
dd offset jtp3,offset jtp3,offset jtp3,offset jtps
DATA ends
public Mofs
public Lineofs
extrn flga:dword
extrn flgb:dword
extrn flg:dword
extrn pix:dword
extrn vram:dword
extrn screen_mode:byte
end